home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1997 January
/
CHIP Turkiye Ocak 1997.iso
/
program
/
sound
/
amod30
/
txt3d.pas
< prev
Wrap
Pascal/Delphi Source File
|
1995-08-11
|
26KB
|
796 lines
unit txt3d;
interface
const
scr_seg : word = $a000;
type
t_matrix = array[0..8] of longint;
var
matrix : t_matrix;
procedure matriisi(var mat : t_matrix;kx2,ky2,kz2 : integer);
procedure rotatep;
procedure line3(x1,y1,x2,y2 : integer;color : byte);
procedure mix;
procedure show;
procedure hide;
procedure setfont;
procedure l3d_cube;
procedure l3d_pyramid;
procedure l3d_adnmod;
procedure l3d_asm95;
procedure init3d;
implementation
const
fontti_POINTS=$08;
fontti : ARRAY [1..$0800] OF CHAR = (
#$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00,
#$7E, #$81, #$A5, #$81, #$BD, #$99, #$81, #$7E,
#$7E, #$FF, #$DB, #$FF, #$C3, #$E7, #$FF, #$7E,
#$6C, #$FE, #$FE, #$FE, #$7C, #$38, #$10, #$00,
#$10, #$38, #$7C, #$FE, #$7C, #$38, #$10, #$00,
#$38, #$7C, #$38, #$FE, #$FE, #$7C, #$38, #$7C,
#$10, #$10, #$38, #$7C, #$FE, #$7C, #$38, #$7C,
#$00, #$00, #$18, #$3C, #$3C, #$18, #$00, #$00,
#$FF, #$FF, #$E7, #$C3, #$C3, #$E7, #$FF, #$FF,
#$00, #$3C, #$66, #$42, #$42, #$66, #$3C, #$00,
#$FF, #$C3, #$99, #$BD, #$BD, #$99, #$C3, #$FF,
#$0F, #$07, #$0F, #$7D, #$CC, #$CC, #$CC, #$78,
#$3C, #$66, #$66, #$66, #$3C, #$18, #$7E, #$18,
#$3F, #$33, #$3F, #$30, #$30, #$70, #$F0, #$E0,
#$7F, #$63, #$7F, #$63, #$63, #$67, #$E6, #$C0,
#$99, #$5A, #$3C, #$E7, #$E7, #$3C, #$5A, #$99,
#$80, #$E0, #$F8, #$FE, #$F8, #$E0, #$80, #$00,
#$02, #$0E, #$3E, #$FE, #$3E, #$0E, #$02, #$00,
#$18, #$3C, #$7E, #$18, #$18, #$7E, #$3C, #$18,
#$66, #$66, #$66, #$66, #$66, #$00, #$66, #$00,
#$7F, #$DB, #$DB, #$7B, #$1B, #$1B, #$1B, #$00,
#$3E, #$63, #$38, #$6C, #$6C, #$38, #$CC, #$78,
#$00, #$00, #$00, #$00, #$7E, #$7E, #$7E, #$00,
#$18, #$3C, #$7E, #$18, #$7E, #$3C, #$18, #$FF,
#$18, #$3C, #$7E, #$18, #$18, #$18, #$18, #$00,
#$18, #$18, #$18, #$18, #$7E, #$3C, #$18, #$00,
#$00, #$18, #$0C, #$FE, #$0C, #$18, #$00, #$00,
#$00, #$30, #$60, #$FE, #$60, #$30, #$00, #$00,
#$00, #$00, #$C0, #$C0, #$C0, #$FE, #$00, #$00,
#$00, #$24, #$66, #$FF, #$66, #$24, #$00, #$00,
#$00, #$18, #$3C, #$7E, #$FF, #$FF, #$00, #$00,
#$00, #$FF, #$FF, #$7E, #$3C, #$18, #$00, #$00,
#$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00,
#$30, #$78, #$78, #$78, #$30, #$00, #$30, #$00,
#$6C, #$6C, #$6C, #$00, #$00, #$00, #$00, #$00,
#$6C, #$6C, #$FE, #$6C, #$FE, #$6C, #$6C, #$00,
#$30, #$7C, #$C0, #$78, #$0C, #$F8, #$30, #$00,
#$00, #$C6, #$CC, #$18, #$30, #$66, #$C6, #$00,
#$38, #$6C, #$38, #$76, #$DC, #$CC, #$76, #$00,
#$60, #$60, #$C0, #$00, #$00, #$00, #$00, #$00,
#$18, #$30, #$60, #$60, #$60, #$30, #$18, #$00,
#$60, #$30, #$18, #$18, #$18, #$30, #$60, #$00,
#$00, #$66, #$3C, #$FF, #$3C, #$66, #$00, #$00,
#$00, #$30, #$30, #$FC, #$30, #$30, #$00, #$00,
#$00, #$00, #$00, #$00, #$00, #$30, #$30, #$60,
#$00, #$00, #$00, #$FC, #$00, #$00, #$00, #$00,
#$00, #$00, #$00, #$00, #$00, #$30, #$30, #$00,
#$06, #$0C, #$18, #$30, #$60, #$C0, #$80, #$00,
#$7C, #$C6, #$CE, #$DE, #$F6, #$E6, #$7C, #$00,
#$30, #$70, #$30, #$30, #$30, #$30, #$FC, #$00,
#$78, #$CC, #$0C, #$38, #$60, #$CC, #$FC, #$00,
#$78, #$CC, #$0C, #$38, #$0C, #$CC, #$78, #$00,
#$1C, #$3C, #$6C, #$CC, #$FE, #$0C, #$1E, #$00,
#$FC, #$C0, #$F8, #$0C, #$0C, #$CC, #$78, #$00,
#$38, #$60, #$C0, #$F8, #$CC, #$CC, #$78, #$00,
#$FC, #$CC, #$0C, #$18, #$30, #$30, #$30, #$00,
#$78, #$CC, #$CC, #$78, #$CC, #$CC, #$78, #$00,
#$78, #$CC, #$CC, #$7C, #$0C, #$18, #$70, #$00,
#$00, #$30, #$30, #$00, #$00, #$30, #$30, #$00,
#$00, #$30, #$30, #$00, #$00, #$30, #$30, #$60,
#$18, #$30, #$60, #$C0, #$60, #$30, #$18, #$00,
#$00, #$00, #$FC, #$00, #$00, #$FC, #$00, #$00,
#$60, #$30, #$18, #$0C, #$18, #$30, #$60, #$00,
#$78, #$CC, #$0C, #$18, #$30, #$00, #$30, #$00,
#$7C, #$C6, #$DE, #$DE, #$DE, #$C0, #$78, #$00,
#$30, #$78, #$CC, #$CC, #$FC, #$CC, #$CC, #$00,
#$FC, #$66, #$66, #$7C, #$66, #$66, #$FC, #$00,
#$3C, #$66, #$C0, #$C0, #$C0, #$66, #$3C, #$00,
#$F8, #$6C, #$66, #$66, #$66, #$6C, #$F8, #$00,
#$7E, #$60, #$60, #$78, #$60, #$60, #$7E, #$00,
#$7E, #$60, #$60, #$78, #$60, #$60, #$60, #$00,
#$3C, #$66, #$C0, #$C0, #$CE, #$66, #$3E, #$00,
#$CC, #$CC, #$CC, #$FC, #$CC, #$CC, #$CC, #$00,
#$78, #$30, #$30, #$30, #$30, #$30, #$78, #$00,
#$1E, #$0C, #$0C, #$0C, #$CC, #$CC, #$78, #$00,
#$E6, #$66, #$6C, #$78, #$6C, #$66, #$E6, #$00,
#$60, #$60, #$60, #$60, #$60, #$60, #$7E, #$00,
#$C6, #$EE, #$FE, #$FE, #$D6, #$C6, #$C6, #$00,
#$C6, #$E6, #$F6, #$DE, #$CE, #$C6, #$C6, #$00,
#$38, #$6C, #$C6, #$C6, #$C6, #$6C, #$38, #$00,
#$FC, #$66, #$66, #$7C, #$60, #$60, #$F0, #$00,
#$78, #$CC, #$CC, #$CC, #$DC, #$78, #$1C, #$00,
#$FC, #$66, #$66, #$7C, #$6C, #$66, #$E6, #$00,
#$78, #$CC, #$E0, #$70, #$1C, #$CC, #$78, #$00,
#$FC, #$30, #$30, #$30, #$30, #$30, #$30, #$00,
#$CC, #$CC, #$CC, #$CC, #$CC, #$CC, #$FC, #$00,
#$CC, #$CC, #$CC, #$CC, #$CC, #$78, #$30, #$00,
#$C6, #$C6, #$C6, #$D6, #$FE, #$EE, #$C6, #$00,
#$C6, #$C6, #$6C, #$38, #$38, #$6C, #$C6, #$00,
#$CC, #$CC, #$CC, #$78, #$30, #$30, #$78, #$00,
#$FE, #$06, #$0C, #$18, #$30, #$60, #$FE, #$00,
#$78, #$60, #$60, #$60, #$60, #$60, #$78, #$00,
#$C0, #$60, #$30, #$18, #$0C, #$06, #$02, #$00,
#$78, #$18, #$18, #$18, #$18, #$18, #$78, #$00,
#$10, #$38, #$6C, #$C6, #$00, #$00, #$00, #$00,
#$00, #$00, #$00, #$00, #$00, #$00, #$00, #$FF,
#$30, #$30, #$18, #$00, #$00, #$00, #$00, #$00,
#$00, #$00, #$78, #$0C, #$7C, #$CC, #$76, #$00,
#$E0, #$60, #$60, #$7C, #$66, #$66, #$DC, #$00,
#$00, #$00, #$78, #$CC, #$C0, #$CC, #$78, #$00,
#$1C, #$0C, #$0C, #$7C, #$CC, #$CC, #$76, #$00,
#$00, #$00, #$78, #$CC, #$FC, #$C0, #$78, #$00,
#$38, #$6C, #$60, #$F0, #$60, #$60, #$F0, #$00,
#$00, #$00, #$76, #$CC, #$CC, #$7C, #$0C, #$F8,
#$E0, #$60, #$6C, #$76, #$66, #$66, #$E6, #$00,
#$30, #$00, #$70, #$30, #$30, #$30, #$78, #$00,
#$0C, #$00, #$0C, #$0C, #$0C, #$CC, #$CC, #$78,
#$E0, #$60, #$66, #$6C, #$78, #$6C, #$E6, #$00,
#$70, #$30, #$30, #$30, #$30, #$30, #$78, #$00,
#$00, #$00, #$CC, #$FE, #$FE, #$D6, #$C6, #$00,
#$00, #$00, #$F8, #$CC, #$CC, #$CC, #$CC, #$00,
#$00, #$00, #$78, #$CC, #$CC, #$CC, #$78, #$00,
#$00, #$00, #$DC, #$66, #$66, #$7C, #$60, #$F0,
#$00, #$00, #$76, #$CC, #$CC, #$7C, #$0C, #$1E,
#$00, #$00, #$DC, #$76, #$66, #$60, #$F0, #$00,
#$00, #$00, #$7C, #$C0, #$78, #$0C, #$F8, #$00,
#$10, #$30, #$7C, #$30, #$30, #$34, #$18, #$00,
#$00, #$00, #$CC, #$CC, #$CC, #$CC, #$76, #$00,
#$00, #$00, #$CC, #$CC, #$CC, #$78, #$30, #$00,
#$00, #$00, #$C6, #$D6, #$FE, #$FE, #$6C, #$00,
#$00, #$00, #$C6, #$6C, #$38, #$6C, #$C6, #$00,
#$00, #$00, #$CC, #$CC, #$CC, #$7C, #$0C, #$F8,
#$00, #$00, #$FC, #$98, #$30, #$64, #$FC, #$00,
#$1C, #$30, #$30, #$E0, #$30, #$30, #$1C, #$00,
#$18, #$18, #$18, #$00, #$18, #$18, #$18, #$00,
#$E0, #$30, #$30, #$1C, #$30, #$30, #$E0, #$00,
#$76, #$DC, #$00, #$00, #$00, #$00, #$00, #$00,
#$00, #$10, #$38, #$6C, #$C6, #$C6, #$FE, #$00,
#$78, #$CC, #$C0, #$CC, #$78, #$18, #$0C, #$78,
#$00, #$CC, #$00, #$CC, #$CC, #$CC, #$7E, #$00,
#$1C, #$00, #$78, #$CC, #$FC, #$C0, #$78, #$00,
#$7E, #$C3, #$3C, #$06, #$3E, #$66, #$3F, #$00,
#$CC, #$00, #$78, #$0C, #$7C, #$CC, #$7E, #$00,
#$E0, #$00, #$78, #$0C, #$7C, #$CC, #$7E, #$00,
#$30, #$30, #$78, #$0C, #$7C, #$CC, #$7E, #$00,
#$00, #$00, #$78, #$C0, #$C0, #$78, #$0C, #$38,
#$7E, #$C3, #$3C, #$66, #$7E, #$60, #$3C, #$00,
#$CC, #$00, #$78, #$CC, #$FC, #$C0, #$78, #$00,
#$E0, #$00, #$78, #$CC, #$FC, #$C0, #$78, #$00,
#$CC, #$00, #$70, #$30, #$30, #$30, #$78, #$00,
#$7C, #$C6, #$38, #$18, #$18, #$18, #$3C, #$00,
#$E0, #$00, #$70, #$30, #$30, #$30, #$78, #$00,
#$C6, #$38, #$6C, #$C6, #$FE, #$C6, #$C6, #$00,
#$30, #$30, #$00, #$78, #$CC, #$FC, #$CC, #$00,
#$1C, #$00, #$FC, #$60, #$78, #$60, #$FC, #$00,
#$00, #$00, #$7F, #$0C, #$7F, #$CC, #$7F, #$00,
#$3E, #$6C, #$CC, #$FE, #$CC, #$CC, #$CE, #$00,
#$78, #$CC, #$00, #$78, #$CC, #$CC, #$78, #$00,
#$00, #$CC, #$00, #$78, #$CC, #$CC, #$78, #$00,
#$00, #$E0, #$00, #$78, #$CC, #$CC, #$78, #$00,
#$78, #$CC, #$00, #$CC, #$CC, #$CC, #$7E, #$00,
#$00, #$E0, #$00, #$CC, #$CC, #$CC, #$7E, #$00,
#$00, #$CC, #$00, #$CC, #$CC, #$7C, #$0C, #$F8,
#$C3, #$18, #$3C, #$66, #$66, #$3C, #$18, #$00,
#$CC, #$00, #$CC, #$CC, #$CC, #$CC, #$78, #$00,
#$18, #$18, #$7E, #$C0, #$C0, #$7E, #$18, #$18,
#$38, #$6C, #$64, #$F0, #$60, #$E6, #$FC, #$00,
#$CC, #$CC, #$78, #$FC, #$30, #$FC, #$30, #$30,
#$F8, #$CC, #$CC, #$FA, #$C6, #$CF, #$C6, #$C7,
#$0E, #$1B, #$18, #$3C, #$18, #$18, #$D8, #$70,
#$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00,
#$F0, #$F0, #$F0, #$F0, #$00, #$00, #$00, #$00,
#$0F, #$0F, #$0F, #$0F, #$00, #$00, #$00, #$00,
#$FF, #$FF, #$FF, #$FF, #$00, #$00, #$00, #$00,
#$00, #$00, #$00, #$00, #$F0, #$F0, #$F0, #$F0,
#$F0, #$F0, #$F0, #$F0, #$F0, #$F0, #$F0, #$F0,
#$0F, #$0F, #$0F, #$0F, #$F0, #$F0, #$F0, #$F0,
#$FF, #$FF, #$FF, #$FF, #$F0, #$F0, #$F0, #$F0,
#$00, #$00, #$00, #$00, #$0F, #$0F, #$0F, #$0F,
#$F0, #$F0, #$F0, #$F0, #$0F, #$0F, #$0F, #$0F,
#$0F, #$0F, #$0F, #$0F, #$0F, #$0F, #$0F, #$0F,
#$FF, #$FF, #$FF, #$FF, #$0F, #$0F, #$0F, #$0F,
#$00, #$00, #$00, #$00, #$FF, #$FF, #$FF, #$FF,
#$F0, #$F0, #$F0, #$F0, #$FF, #$FF, #$FF, #$FF,
#$0F, #$0F, #$0F, #$0F, #$FF, #$FF, #$FF, #$FF,
#$FF, #$FF, #$FF, #$FF, #$FF, #$FF, #$FF, #$FF,
#$22, #$88, #$22, #$88, #$22, #$88, #$22, #$88,
#$55, #$AA, #$55, #$AA, #$55, #$AA, #$55, #$AA,
#$DB, #$77, #$DB, #$EE, #$DB, #$77, #$DB, #$EE,
#$18, #$18, #$18, #$18, #$18, #$18, #$18, #$18,
#$18, #$18, #$18, #$18, #$F8, #$18, #$18, #$18,
#$18, #$18, #$F8, #$18, #$F8, #$18, #$18, #$18,
#$36, #$36, #$36, #$36, #$F6, #$36, #$36, #$36,
#$00, #$00, #$00, #$00, #$FE, #$36, #$36, #$36,
#$00, #$00, #$F8, #$18, #$F8, #$18, #$18, #$18,
#$36, #$36, #$F6, #$06, #$F6, #$36, #$36, #$36,
#$36, #$36, #$36, #$36, #$36, #$36, #$36, #$36,
#$00, #$00, #$FE, #$06, #$F6, #$36, #$36, #$36,
#$36, #$36, #$F6, #$06, #$FE, #$00, #$00, #$00,
#$36, #$36, #$36, #$36, #$FE, #$00, #$00, #$00,
#$18, #$18, #$F8, #$18, #$F8, #$00, #$00, #$00,
#$00, #$00, #$00, #$00, #$F8, #$18, #$18, #$18,
#$18, #$18, #$18, #$18, #$1F, #$00, #$00, #$00,
#$18, #$18, #$18, #$18, #$FF, #$00, #$00, #$00,
#$00, #$00, #$00, #$00, #$FF, #$18, #$18, #$18,
#$18, #$18, #$18, #$18, #$1F, #$18, #$18, #$18,
#$00, #$00, #$00, #$00, #$FF, #$00, #$00, #$00,
#$18, #$18, #$18, #$18, #$FF, #$18, #$18, #$18,
#$18, #$18, #$1F, #$18, #$1F, #$18, #$18, #$18,
#$36, #$36, #$36, #$36, #$37, #$36, #$36, #$36,
#$36, #$36, #$37, #$30, #$3F, #$00, #$00, #$00,
#$00, #$00, #$3F, #$30, #$37, #$36, #$36, #$36,
#$36, #$36, #$F7, #$00, #$FF, #$00, #$00, #$00,
#$00, #$00, #$FF, #$00, #$F7, #$36, #$36, #$36,
#$36, #$36, #$37, #$30, #$37, #$36, #$36, #$36,
#$00, #$00, #$FF, #$00, #$FF, #$00, #$00, #$00,
#$36, #$36, #$F7, #$00, #$F7, #$36, #$36, #$36,
#$18, #$18, #$FF, #$00, #$FF, #$00, #$00, #$00,
#$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00,
#$F0, #$F0, #$F0, #$F0, #$00, #$00, #$00, #$00,
#$0F, #$0F, #$0F, #$0F, #$00, #$00, #$00, #$00,
#$FF, #$FF, #$FF, #$FF, #$00, #$00, #$00, #$00,
#$00, #$00, #$00, #$00, #$F0, #$F0, #$F0, #$F0,
#$F0, #$F0, #$F0, #$F0, #$F0, #$F0, #$F0, #$F0,
#$0F, #$0F, #$0F, #$0F, #$F0, #$F0, #$F0, #$F0,
#$FF, #$FF, #$FF, #$FF, #$F0, #$F0, #$F0, #$F0,
#$00, #$00, #$00, #$00, #$0F, #$0F, #$0F, #$0F,
#$F0, #$F0, #$F0, #$F0, #$0F, #$0F, #$0F, #$0F,
#$0F, #$0F, #$0F, #$0F, #$0F, #$0F, #$0F, #$0F,
#$FF, #$FF, #$FF, #$FF, #$0F, #$0F, #$0F, #$0F,
#$00, #$00, #$00, #$00, #$FF, #$FF, #$FF, #$FF,
#$F0, #$F0, #$F0, #$F0, #$FF, #$FF, #$FF, #$FF,
#$0F, #$0F, #$0F, #$0F, #$FF, #$FF, #$FF, #$FF,
#$FF, #$FF, #$FF, #$FF, #$FF, #$FF, #$FF, #$FF,
#$00, #$00, #$76, #$DC, #$C8, #$DC, #$76, #$00,
#$00, #$78, #$CC, #$F8, #$CC, #$F8, #$C0, #$C0,
#$00, #$FC, #$CC, #$C0, #$C0, #$C0, #$C0, #$00,
#$00, #$FE, #$6C, #$6C, #$6C, #$6C, #$6C, #$00,
#$FC, #$CC, #$60, #$30, #$60, #$CC, #$FC, #$00,
#$00, #$00, #$7E, #$D8, #$D8, #$D8, #$70, #$00,
#$00, #$66, #$66, #$66, #$66, #$7C, #$60, #$C0,
#$00, #$76, #$DC, #$18, #$18, #$18, #$18, #$00,
#$FC, #$30, #$78, #$CC, #$CC, #$78, #$30, #$FC,
#$38, #$6C, #$C6, #$FE, #$C6, #$6C, #$38, #$00,
#$38, #$6C, #$C6, #$C6, #$6C, #$6C, #$EE, #$00,
#$1C, #$30, #$18, #$7C, #$CC, #$CC, #$78, #$00,
#$00, #$00, #$7E, #$DB, #$DB, #$7E, #$00, #$00,
#$06, #$0C, #$7E, #$DB, #$DB, #$7E, #$60, #$C0,
#$38, #$60, #$C0, #$F8, #$C0, #$60, #$38, #$00,
#$78, #$CC, #$CC, #$CC, #$CC, #$CC, #$CC, #$00,
#$00, #$FC, #$00, #$FC, #$00, #$FC, #$00, #$00,
#$30, #$30, #$FC, #$30, #$30, #$00, #$FC, #$00,
#$60, #$30, #$18, #$30, #$60, #$00, #$FC, #$00,
#$18, #$30, #$60, #$30, #$18, #$00, #$FC, #$00,
#$0E, #$1B, #$1B, #$18, #$18, #$18, #$18, #$18,
#$18, #$18, #$18, #$18, #$18, #$D8, #$D8, #$70,
#$30, #$30, #$00, #$FC, #$00, #$30, #$30, #$00,
#$00, #$76, #$DC, #$00, #$76, #$DC, #$00, #$00,
#$38, #$6C, #$6C, #$38, #$00, #$00, #$00, #$00,
#$00, #$00, #$00, #$18, #$18, #$00, #$00, #$00,
#$00, #$00, #$00, #$00, #$18, #$00, #$00, #$00,
#$0F, #$0C, #$0C, #$0C, #$EC, #$6C, #$3C, #$1C,
#$78, #$6C, #$6C, #$6C, #$6C, #$00, #$00, #$00,
#$70, #$18, #$30, #$60, #$78, #$00, #$00, #$00,
#$00, #$00, #$3C, #$3C, #$3C, #$3C, #$00, #$00,
#$00, #$00, #$00, #$00, #$00, #$00, #$00, #$00);
_mul = 1024;
_mul2 = 512;
maxpoints = 50;
obj_x = 0;
obj_y = 0;
obj_z : integer = 250;
{$i 3d.inc}
var
yofs : array[0..200] of word;
sini,cosini : array[0..1000] of real;
lines : array[0..maxpoints,0..1] of integer;
points,rpoints : array[0..maxpoints,0..3] of integer;
procedure matriisi(var mat : t_matrix;kx2,ky2,kz2 : integer);
var
xa1,xa2,xa3,
ya1,ya2,ya3,
za1,za2,za3 : real;
sinkz : real;
begin
kx2 := kx2 mod 1000;
ky2 := ky2 mod 1000;
kz2 := kz2 mod 1000;
if kx2 < 0 then inc(kx2,1000);
if ky2 < 0 then inc(ky2,1000);
if kz2 < 0 then inc(kz2,1000);
sinkz := sini[kz2];
xa1 := cosini[KZ2]*cosini[KY2];
xa2 := -sinkz*cosini[KX2]-cosini[KZ2]*sini[KY2]*sini[KX2];
xa3 := sinkz*sini[KX2]-cosini[KZ2]*sini[KY2]*cosini[KX2];
ya1 := sinkz*cosini[KY2];
ya2 := cosini[KZ2]*cosini[KX2]-sinkz*sini[KY2]*sini[KX2];
ya3 := -sinkz*sini[KY2]*cosini[KX2]-cosini[KZ2]*sini[KX2];
za1 := sini[KY2];
za2 := cosini[KY2]*sini[KX2];
za3 := cosini[KY2]*cosini[KX2];
mat[0] := round(xa1*_mul);
mat[1] := round(xa2*_mul);
mat[2] := round(xa3*_mul);
mat[3] := round(ya1*_mul);
mat[4] := round(ya2*_mul);
mat[5] := round(ya3*_mul);
mat[6] := round(za1*_mul);
mat[7] := round(za2*_mul);
mat[8] := round(za3*_mul);
end;
procedure rotatep;
var
ax_,ay,az : longint;
x,y,z : longint;
rx,ry : integer;
n,col : integer;
maxp : integer;
begin
maxp := points[0,0];
for n := 1 to maxp do begin
x := points[n,0];
y := points[n,1];
z := points[n,2];
asm
mov ax,word ptr x
imul word ptr matrix[0]
mov cx,dx
mov bx,ax
xor dx,dx
mov ax,word ptr y
imul word ptr matrix[4]
add bx,ax
adc cx,dx
mov ax,word ptr z
imul word ptr matrix[8]
add ax,bx
adc dx,cx
shl dx,6
shr ax,10
add ax,dx
add ax,obj_x
cwd
mov word ptr ax_,ax
mov word ptr ax_+2,dx
mov ax,word ptr x
imul word ptr matrix[12]
mov cx,dx
mov bx,ax
xor dx,dx
mov ax,word ptr y
imul word ptr matrix[16]
add bx,ax
adc cx,dx
mov ax,word ptr z
imul word ptr matrix[20]
add ax,bx
adc dx,cx
shl dx,6
shr ax,10
add ax,dx
add ax,obj_y
cwd
mov word ptr ay,ax
mov word ptr ay+2,dx
mov ax,word ptr x
imul word ptr matrix[24]
mov cx,dx
mov bx,ax
xor dx,dx
mov ax,word ptr y
imul word ptr matrix[28]
add bx,ax
adc cx,dx
mov ax,word ptr z
imul word ptr matrix[32]
add ax,bx
adc dx,cx
shl dx,6
shr ax,10
add ax,dx
add ax,obj_z
cwd
mov word ptr az,ax
mov word ptr az+2,dx
end;
{ax_:= (x*matrix[0] +
y*matrix[1] +
z*matrix[2]) div _mul;
ay:= (x*matrix[3]+
y*matrix[4]+
z*matrix[5]) div _mul;
az:= obj_z+(x*matrix[6]+
y*matrix[7]+
z*matrix[8]) div _mul;
rpoints[n,0] := 160+200*longint(ax_) div longint(az);
rpoints[n,1] := 100+166*longint(ay) div longint(az);
rpoints[n,2] := az;}
asm
mov bx,n
shl bx,3
mov cx,word ptr az
mov ax,120
imul word ptr ax_
idiv cx
add ax,80
mov word ptr rx,ax
mov ax,100
imul word ptr ay
idiv cx
add ax,50
mov word ptr ry,ax
mov [bx+offset rpoints+2],ax
mov ax,word ptr rx
mov [bx+offset rpoints],ax
end;
end;
end;
procedure init3d;
var
n : integer;
begin
for n := 0 to 1000 do begin
sini[n] := sin(n*pi/500);
cosini[n] := cos(n*pi/500);
end;
fillchar(points,sizeof(points),0);
fillchar(rpoints,sizeof(rpoints),0);
for n := 0 to 100 do yofs[n] := n*160;
end;
procedure xline3(d,_dx,incr1,incr2,yinc,address:word;color:byte); assembler;
{ draw line with X as the independent variable
d decision variable
_dx number of pixels in x-dimension of line
incr1 increment #1 value for decision variable
incr2 increment #2 value for decision variable
yinc amount to add to y variable / point
address starting offset address into display memory
color desired color}
asm
push ds
mov ds,scr_seg
{ load the working registers with the variables}
mov di,address
mov cx,_dx {number of points -> cx}
mov bx,d {decision variable -> bx}
mov al,color
{operational loop}
@@runloop:
{send the first point}
mov [di],al {write to display memory}
inc di {increment x variable}
cmp bx,0 {d = 0 ?}
jl @@noinc {jump if d < 0}
{adjust d += incr2 + increment y += inc}
add bx,incr2 {d = d+incr2}
add di,yinc {y (address) += offset}
{jmp @@check}
{adjust d += incr1}
@@noinc:
add bx,incr1 {d = d+incr1}
@@check:
dec cx
jnz @@runloop
pop ds
end;
procedure yline3(d,dy,incr1,incr2,xinc,address,ofset:word;color:byte);
assembler;
{draw a line with Y as the independent variable
d decision variable
dy # of pixels in y-dimension of line
incr1 increment #1 value for decision variable
incr2 increment #2 value for decision variable
xinc amount to add to x variable / point
address starting offset adress of display memory
ofset display offset}
asm
push ds
mov ds,scr_seg
{load working registers with the variables}
mov di,address {load display offset address}
mov cx,dy {# of points -> cx}
mov bx,d {decision variable -> bx}
mov ah,color
@@runloop:
mov [di],ah {write to display memory}
add di,160 {y (address) += offset (always positive)}
cmp bx,0 {d = 0 ?}
jl @@noinc {jump if d < 0}
add bx,incr2 {d = d+incr2}
add di,xinc {inc x variable}
{jmp @@check}
@@noinc:
add bx,incr1 {d = d+incr1}
@@check:
dec cx
jnz @@runloop
pop ds
end;
procedure hline3(x1,x2,y,offset : word;color : byte);
var
x,dx,address : integer;
procedure hsub3(address,_dx : word;color:byte); assembler;
asm
cld
mov es,scr_seg
mov di,address
mov cx,_dx
mov al,color
rep stosb
end;
begin
if (y < 0) or (y > 99) then exit;
if x1 > x2 then begin
x := x1; x1 := x2; x2:= x; {reverse x-coordinates}
end;
if (x1 > 159) or (x2 < 0) then exit;
if x1 < 0 then x1 := 0;
if x2 > 159 then x2 := 159;
{dx := (x2-x1)+1;
address := (y*offset)+x1;
hsub3(address,dx,color);}
asm
mov cx,x2
sub cx,x1
inc cx
mov di,y
add di,di
mov di,[di+offset yofs]
add di,x1
mov es,scr_seg
mov al,color
rep stosb
end;
end;
procedure vline3(x,y1,y2,ofset : integer;color : byte);
var
t,dy,address : integer;
procedure vsub3(address,dy,ofset : word;color : byte); assembler;
asm
mov es,scr_seg
mov di,address
mov cx,dy
mov al,color
@@runloop:
mov es:[di],al
add di,ofset
dec cx
jnz @@runloop
end;
begin
if (x < 0) or (x > 159) then exit;
if y1 > y2 then begin
t := y2; y2 := y1; y1 := t;
end;
if (y1 > 99) or (y2 < 0) then exit;
if y1 < 0 then y1 := 0;
if y2 > 99 then y2 := 99;
{dy := y2-y1+1;}
asm
mov es,scr_seg
mov cx,y2
sub cx,y1
inc cx
mov bx,y1
add bx,bx
mov di,[bx+offset yofs]
add di,x
mov al,color
@@runloop:
mov es:[di],al
add di,160
dec cx
jnz @@runloop
end;
{vsub3(address,dy,offset,color);}
end;
procedure line3(x1,y1,x2,y2 : integer;color : byte);
const
offset : integer = 160;
var
dx,dy,d,d2,xinc,yinc,incr1,incr2,x,y,address : integer;
begin
if y1 > y2 then begin
d := x1;
x1 := x2;
x2 := d;
d := y1;
y1 := y2;
y2 := d;
end;
dx := abs(x2-x1); {x-length}
if dx = 0 then vline3(x1,y1,y2,offset,color)
else begin
dy := abs(y2-y1);
if dy = 0 then hline3(x1,x2,y1,offset,color)
else begin {neither horz or vert then do bresenhams}
{is the slope between 0 and 1 ie. dy > dx}
if dx >= dy then begin {slope < 1 quadrants 0,1,2 or 3}
if x1 > x2 then begin {quadrant 0 or 1}
x := x2; y := y2;
if y2 > y1 then yinc := -offset {quadrant 0}
else yinc := offset; {quadrant 1}
end
else begin
x := x1; y := y1;
if y2 > y1 then yinc := offset {quadrant 2}
else yinc := -offset; {quadrant 3}
end;
address := y*offset+x; {starting address}
d2 := dy shl 1; {y distance times 2}
d := d2-dx; {init the decision variable to 2*dy-dx}
incr1 := d2; {incr. for decision var. if d < 0}
incr2 := (dy-dx) shl 1-incr1; {incr. for decision var if d >= 0}
xline3(d,dx+1,incr1,incr2,yinc,address,color);
end
else begin {slope > 1 quadrant 4, 5, 6 or 7}
if y1 > y2 then begin {quadrant 4 or 5}
x := x2; y := y2;
if x > x1 then xinc := -1 {quadrant 4}
else xinc := 1; {quadrant 5}
end
else begin
x := x1; y := y1; {quadrant 6 or 7}
if x2 > x1 then xinc := 1 {quadrant 6}
else xinc := -1; {quadrant 7}
end;
address := y*offset+x;
d2 := dx shl 1; {x distance times 2}
d := d2-dy; {decision var. = 2*dx-dy}
incr1 := d2; {incr. for decision var, d' if d <0}
incr2 := (dx-dy) shl 1-incr1; {incr. for decision var if d >= 0}
yline3(d,dy+1,incr1,incr2,xinc,address,offset,color);
end; {end of quadrants 0,1,2,3 or 4,5,6,7}
end;
end;
end;
procedure mix; assembler;
asm
push ds
mov ds,scr_seg
mov si,0
mov ax,0b800h
mov es,ax
mov di,0
mov dx,49
@@y:
mov cx,80
@@x:
mov ah,[si+1]
add ah,ah
add ah,[si]
mov al,[si+160]
shl al,2
add ah,al
mov al,[si+161]
shl al,3
add ah,al
add ah,208
mov es:[di],ah
add si,2
add di,2
dec cx
jnz @@x
add si,160
dec dx
jnz @@y
pop ds
end;
procedure show;
var
n : integer;
p1,p2 : integer;
begin
for n := 1 to lines[0,0] do begin
p1 := lines[n,0];
p2 := lines[n,1];
line3(rpoints[p1,0],rpoints[p1,1],
rpoints[p2,0],rpoints[p2,1],1);
end;
end;
procedure hide; assembler;
asm
cld
xor ax,ax
mov cx,160*100/2
mov es,scr_seg
mov di,0
rep stosw
end;
procedure setfont; assembler;
asm
push bp
mov ax,seg fontti
mov es,ax
mov bp,offset fontti
mov bx,$800
mov dx,0
mov cx,256
mov ax,$1110
int 10h
pop bp
end;
procedure l3d_cube;
begin
move(cubep,points,sizeof(cubep));
move(cubel,lines,sizeof(cubel));
obj_z := points[0,1];
end;
procedure l3d_pyramid;
begin
move(pyramidp,points,sizeof(cubep));
move(pyramidl,lines,sizeof(cubel));
obj_z := points[0,1];
end;
procedure l3d_adnmod;
begin
move(adnmodp,points,sizeof(adnmodp));
move(adnmodl,lines,sizeof(adnmodl));
obj_z := points[0,1];
end;
procedure l3d_asm95;
begin
move(asm95p,points,sizeof(asm95p));
move(asm95l,lines,sizeof(asm95l));
obj_z := points[0,1];
end;
end.